Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Comma operator</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Comma_operator"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Comma_operator rootpage-Comma_operator skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Comma operator</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<p>In the <a href="C_(programming_language)" title="C (programming language)">C</a> and <a href="C%2B%2B" title="C++">C++</a> programming languages, the <b>comma operator</b> (represented by the <a href="Token_(parser)" class="mw-redirect" title="Token (parser)">token</a> <code>,</code>) is a <a href="Binary_operator" class="mw-redirect" title="Binary operator">binary operator</a> that evaluates its first <a href="Operand" title="Operand">operand</a> and discards the result, and then evaluates the second operand and returns this value (and type); there is a <a href="Sequence_point" title="Sequence point">sequence point</a> between these evaluations.
</p><p>The use of the comma token as an <em><a href="Operator_(computer_programming)" title="Operator (computer programming)">operator</a></em> is distinct from its use in <a href="Function_call" class="mw-redirect" title="Function call">function calls</a> and definitions, variable declarations, enum declarations, and similar constructs, where it acts as a <em><a href="Delimiter" title="Delimiter">separator</a></em>.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Syntax">Syntax</h2></div>
<p>The comma operator separates <i>expressions</i> (which have value) in a way analogous to how the <a href="Semicolon#Programming" title="Semicolon">semicolon</a> terminates <i>statements,</i> and sequences of expressions are enclosed in parentheses analogously to how sequences of statements are enclosed in braces:<sup id="cite_ref-Various,_Microsoft,_2019_1-0" class="reference"><a href="#cite_note-Various,_Microsoft,_2019-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> <code>(a, b, c)</code> is a sequence of expressions, separated by commas, which evaluates to the last expression <code>c</code>, while <code>{a; b; c;}</code> is a sequence of statements, and does not evaluate to any value. A comma can only occur between two expressions – commas <i>separate</i> expressions – unlike the semicolon, which occurs at the end of a (non-block) statement – semicolons <i>terminate</i> statements.
</p><p>The comma operator has the lowest <a href="Operators_in_C_and_C%2B%2B#Expression_evaluation_order" title="Operators in C and C++">precedence</a> of any C operator, and acts as a <a href="Sequence_point" title="Sequence point">sequence point</a>. In a combination of commas and semicolons, semicolons have lower precedence than commas, as semicolons separate statements but commas occur within statements, which accords with their use as ordinary punctuation: <code>a, b; c, d</code> is grouped as <code>(a, b); (c, d)</code> because these are two separate statements.
</p><p>The comma operator has been <a href="Deprecation" title="Deprecation">deprecated</a> in subscripting expressions (as of <a href="C%2B%2B20" title="C++20">C++20</a>);<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> to reduce confusion, and open up the future possibility of repurposing the syntax for multidimensional array indexing. In <a href="C%2B%2B23" title="C++23">C++23</a>, the ability to overload <code>operator[]</code> with multiple arguments was added making unparenthesised comma expressions unusable in subscripts.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> The comma operator is still usable and not deprecated in this context if the comma expression is surrounded by parentheses (as in <code>a[(b,c)]</code>).
</p>
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<p>In this example, the differing behavior between the second and third lines is due to the comma operator having lower precedence than assignment. The last example differs as well since the return expression must be fully evaluated before the function can return.
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cm">/**</span>
<span class="cm"> * Commas act as separators in this line, not as an operator.</span>
<span class="cm"> * Results: a=1, b=2, c=3, i=0</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * Assigns value of b into i.</span>
<span class="cm"> * Commas act as separators in the first line and as an operator in the second line.</span>
<span class="cm"> * Results: a=1, b=2, c=3, i=2</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span><span class="w"> </span>
<span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w"> </span>
<span class="w"> </span>
<span class="cm">/**</span>
<span class="cm"> * Assigns value of a into i.</span>
<span class="cm"> * Equivalent to: int i = a; int b;</span>
<span class="cm"> * Commas act as separators in both lines.</span>
<span class="cm"> * The braces on the second line avoid variable redeclaration in the same block,</span>
<span class="cm"> * which would cause a compilation error.</span>
<span class="cm"> * The second b declared is given no initial value.</span>
<span class="cm"> * Results: a=1, b=2, c=3, i=1</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span><span class="w"> </span>
<span class="p">{</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>

<span class="cm">/**</span>
<span class="cm"> * Increases value of a by 2, then assigns value of resulting operation a + b into i.</span>
<span class="cm"> * Commas act as separators in the first line and as an operator in the second line.</span>
<span class="cm"> * Results: a=3, b=2, c=3, i=5</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="p">);</span>
<span class="w"> </span>
<span class="cm">/**</span>
<span class="cm"> * Increases value of a by 2, then stores value of a to i, and discards unused</span>
<span class="cm"> * values of resulting operation a + b.</span>
<span class="cm"> * Equivalent to: (i = (a += 2)), a + b;</span>
<span class="cm"> * Commas act as separators in the first line and as an operator in the third line.</span>
<span class="cm"> * Results: a=3, b=2, c=3, i=3</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * Assigns value of a into i.</span>
<span class="cm"> * Commas act as separators in both lines.</span>
<span class="cm"> * The braces on the second line avoid variable redeclaration in the same block,</span>
<span class="cm"> * which would cause a compilation error.</span>
<span class="cm"> * The second b and c declared are given no initial value.</span>
<span class="cm"> * Results: a=1, b=2, c=3, i=1</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="p">{</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>

<span class="cm">/**</span>
<span class="cm"> * Commas act as separators in the first line and as an operator in the second line.</span>
<span class="cm"> * Assigns value of c into i, discarding the unused a and b values.</span>
<span class="cm"> * Results: a=1, b=2, c=3, i=3</span>
<span class="cm"> */</span>
<span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">);</span>

<span class="cm">/**</span>
<span class="cm"> * Returns 6, not 4, since comma operator sequence points following the keyword </span>
<span class="cm"> * return are considered a single expression evaluating to rvalue of final </span>
<span class="cm"> * subexpression c=6.</span>
<span class="cm"> * Commas act as operators in this line.</span>
<span class="cm"> */</span>
<span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="o">=</span><span class="mi">6</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * Returns 3, not 1, for same reason as previous example.</span>
<span class="cm"> * Commas act as operators in this line.</span>
<span class="cm"> */</span>
<span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * Returns 3, not 1, still for same reason as above. This example works as it does</span>
<span class="cm"> * because return is a keyword, not a function call. Even though compilers will </span>
<span class="cm"> * allow for the construct return(value), the parentheses are only relative to "value"</span>
<span class="cm"> * and have no special effect on the return keyword.</span>
<span class="cm"> * Return simply gets an expression and here the expression is "(1), 2, 3".</span>
<span class="cm"> * Commas act as operators in this line.</span>
<span class="cm"> */</span>
<span class="k">return</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Uses">Uses</h2></div>
<p>The comma operator has relatively limited use cases. Because it discards its first operand, it is generally only useful where the first operand has desirable <a href="Side_effect_(computer_science)" title="Side effect (computer science)">side effects</a> that must be <i>sequenced before</i> the second operand. Further, because it is rarely used outside of specific idioms, and easily mistaken with other commas or the semicolon, it is potentially confusing and error-prone. Nevertheless, there are certain circumstances where it is commonly used, notably in for loops and in <a href="SFINAE" class="mw-redirect" title="SFINAE">SFINAE</a>.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> For embedded systems which may have limited debugging capabilities, the comma operator can be used in combination with a macro to seamlessly override a function call, to insert code just before the function call.
</p>
<div class="mw-heading mw-heading3"><h3 id="For_loops">For loops</h3></div>
<p>The most common use is to allow multiple <a href="Assignment_(computer_science)" title="Assignment (computer science)">assignment</a> statements without using a block statement, primarily in the initialization and the increment expressions of a <a href="For_loop" title="For loop">for loop</a>. This is the only idiomatic use in elementary C programming. In the following example, the order of the loop's initializers is significant:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="kt">void</span><span class="w"> </span><span class="nf">rev</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">len</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">first</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">first</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">len</span><span class="p">;</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="n">first</span><span class="p">;</span><span class="w"> </span><span class="o">--</span><span class="n">s</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">putchar</span><span class="p">(</span><span class="o">*</span><span class="n">s</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>An alternative solution to this problem in other languages is <a href="Parallel_assignment" class="mw-redirect" title="Parallel assignment">parallel assignment</a>, which allows multiple assignments to occur within a single statement, and also uses a comma, though with different syntax and semantics. This is used in <a href="Go_(programming_language)" title="Go (programming language)">Go</a> in its analogous for loop.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>Outside of for loop initializers (which have a special use of semicolons), the comma might be used instead of a semicolon, particularly when the statements in question function similarly to a loop increment (e.g. at the end of a while loop):
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="o">++</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="o">++</span><span class="n">q</span><span class="p">;</span>
<span class="o">++</span><span class="n">p</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">q</span><span class="p">;</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Macros">Macros</h3></div>
<p>The comma can be used in preprocessor macros to perform multiple operations in the space of a single syntactic expression.
</p><p>One common use is to provide custom error messages in failed assertions. This is done by passing a parenthesized expression list to the <code>assert</code> macro, where the first expression is an error string and the second expression is the condition being asserted. The <code>assert</code> macro outputs its argument verbatim on an assertion failure. The following is an example:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;assert.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">&lt;=</span><span class="mi">9</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="s">"i is too big!"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">);</span>
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"i = %i</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Output:
</p>
<pre>i = 0
i = 1
i = 2
i = 3
i = 4
assert: assert.c:6: test_assert: Assertion `( "i is too big!", i &lt;= 4 )' failed.
Aborted
</pre>
<p>However the assert macro is usually disabled in production code, so use it only for debug purposes.
</p>
<div class="mw-heading mw-heading3"><h3 id="Condition">Condition</h3></div>
<p>The comma can be used within a condition (of an if, while, do while, or for) to allow auxiliary computations, particularly calling a function and using the result, with <a href="Block_scoping" class="mw-redirect" title="Block scoping">block scoping</a>:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="c1">// statements involving x and y</span>
<span class="p">}</span>
</pre></div>
<p>A similar idiom exists in <a href="Go_(programming_language)" title="Go (programming language)">Go</a>, where the syntax of the if statement explicitly allows an optional statement.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Complex_return">Complex return</h3></div>
<p>The comma can be used in return statements, to assign to a global variable or out parameter (passed by reference). This idiom suggests that the assignments are part of the return, rather than auxiliary assignments in a block that terminates with the actual return. For example, in setting a global error number:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">failure</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">errno</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">EINVAL</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span>
</pre></div>
<p>This can be written more verbosely as:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">failure</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">errno</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">EINVAL</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Avoid_a_block">Avoid a block</h3></div>
<p>For brevity, the comma can be used to avoid a block and associated braces, as in:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
</pre></div>
<p>instead of:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;}</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Other_languages">Other languages</h2></div>
<p>In the <a href="OCaml" title="OCaml">OCaml</a> and <a href="Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a> programming languages, the semicolon (";") is used for this purpose.
</p><p><a href="JavaScript" title="JavaScript">JavaScript</a>,<sup id="cite_ref-MDN,_2014_7-0" class="reference"><a href="#cite_note-MDN,_2014-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> <a href="Perl" title="Perl">Perl</a><sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> and <a href="D_(programming_language)" title="D (programming language)">D</a><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> utilize the comma operator in the same way C/C++ does.
</p><p>Some other languages with C-like syntax, such as <a href="Java_(programming_language)" title="Java (programming language)">Java</a><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> and <a href="C_sharp_(programming_language)" class="mw-redirect" title="C sharp (programming language)">C#</a>, do not have this feature, though C# supports a comma-separated list of expressions in the initializer and iterator of a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">for</code> statement,<sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> thus enabling an equivalent of this in this specific context.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Operators_in_C_and_C%2B%2B" title="Operators in C and C++">Operators in C and C++</a>&nbsp;– List of operators in C and C++</li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-Various,_Microsoft,_2019-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-Various,_Microsoft,_2019_1-0">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20190802022035/https://docs.microsoft.com/en-us/cpp/cpp/comma-operator?view=vs-2019">"Comma Operator"</a>. <i><a href="Microsoft" title="Microsoft">Microsoft</a> dev docs</i>. Archived from <a rel="nofollow" class="external text" href="https://docs.microsoft.com/en-us/cpp/cpp/comma-operator?view=vs-2019">the original</a> on 2 August 2019<span class="reference-accessdate">. Retrieved <span class="nowrap">1 August</span> 2019</span>. <q>Two expressions separated by a comma are evaluated left to right. The left operand is always evaluated, and all side effects are completed before the right operand is evaluated.</q></cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1161r2.html">"P1161R2: Deprecate uses of the comma operator in subscripting expressions"</a>. <i>www.open-std.org</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2022-09-05</span></span>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite id="CITEREFMark_HoemmenDaisy_HollmanCorentin_JabotIsabella_Muerte2021" class="citation web cs1">Mark Hoemmen; Daisy Hollman; Corentin Jabot; Isabella Muerte; Christian Trott (2021-09-14). <a rel="nofollow" class="external text" href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2128r6.pdf">"Multidimensional subscript operator"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://en.cppreference.com/w/cpp/language/sfinae">"SFINAE"</a>. <i>en.cppreference.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2022-08-30</span></span>.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://golang.org/doc/effective_go.html">Effective Go</a>: <a rel="nofollow" class="external text" href="https://golang.org/doc/effective_go.html#for">for</a>,
"Finally, Go has no comma operator and ++ and -- are statements not expressions. Thus if you want to run multiple variables in a for you should use parallel assignment (although that precludes ++ and --)."</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text">The Go Programming Language Specification: <a rel="nofollow" class="external text" href="https://golang.org/ref/spec#If_statements">If statements</a></span>
</li>
<li id="cite_note-MDN,_2014-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-MDN,_2014_7-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20140712200108/https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator">"Comma operator"</a>. <i><a href="MDN_Web_Docs" title="MDN Web Docs">MDN Web Docs</a></i>. 17 January 2020. Archived from <a rel="nofollow" class="external text" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator">the original</a> on 12 July 2014<span class="reference-accessdate">. Retrieved <span class="nowrap">25 January</span> 2020</span>. <q>You can use the comma operator when you want to include multiple expressions in a location that requires a single expression.</q></cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://perldoc.perl.org/perlop.html#Comma-Operator">"Perlop - Perl operators and precedence - Perldoc Browser"</a>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://dlang.org/spec/expression.html#comma_expression">"Expressions - D Programming Language § Comma Expression"</a>.</cite></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://stackoverflow.com/questions/38733508/is-comma-operator-or-separator-in-java">"Is comma (,) operator or separator in Java?"</a>.</cite></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/statements#1394-the-for-statement">"Statements - C# Language Specification | Microsoft Learn § The for statement"</a>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading3"><h3 id="Bibliography">Bibliography</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1239549316">
/* start https://en.wikipedia.org/ */


.mw-parser-output .refbegin{margin-bottom:0.5em}.mw-parser-output .refbegin-hanging-indents>ul{margin-left:0}.mw-parser-output .refbegin-hanging-indents>ul>li{margin-left:0;padding-left:3.2em;text-indent:-3.2em}.mw-parser-output .refbegin-hanging-indents ul,.mw-parser-output .refbegin-hanging-indents ul li{list-style:none}@media(max-width:720px){.mw-parser-output .refbegin-hanging-indents>ul>li{padding-left:1.6em;text-indent:-1.6em}}.mw-parser-output .refbegin-columns{margin-top:0.3em}.mw-parser-output .refbegin-columns ul{margin-top:0}.mw-parser-output .refbegin-columns li{page-break-inside:avoid;break-inside:avoid-column}@media screen{.mw-parser-output .refbegin{font-size:90%}}


/* end https://en.wikipedia.org/ */
</style><div class="refbegin" style="">
<ul><li><cite id="CITEREFRamajaran1994" class="citation cs2">Ramajaran, V. (1994), <i>Computer Programming in C</i>, New Delhi: Prentice Hall of India</cite></li>
<li><cite id="CITEREFDixit2005" class="citation cs2">Dixit, J.B (2005), <i>Fundamentals of computers and programming in C</i>, New Delhi: Laxmi Publications</cite></li>
<li><cite id="CITEREFKernighanRitchie1988" class="citation cs2">Kernighan, Brian W.; <a href="Dennis_M._Ritchie" class="mw-redirect" title="Dennis M. Ritchie">Ritchie, Dennis M.</a> (1988), <i>The C Programming Language</i> (2nd&nbsp;ed.), Englewood Cliffs, NJ: Prentice Hall</cite></li></ul>
</div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li>"<a rel="nofollow" class="external text" href="https://stackoverflow.com/questions/2087026/effect-of-using-a-comma-instead-of-a-semi-colon-in-c-and-c">Effect of using a comma instead of a semi-colon in C and C++</a>", <i>Stack Overflow</i></li>
<li><a rel="nofollow" class="external text" href="http://www.boost.org/doc/libs/1_44_0/libs/assign/doc/index.html">Boost.Assignment</a> – facility from the <a href="Boost_(C%2B%2B_libraries)" title="Boost (C++ libraries)">Boost</a> library that makes it easy to fill containers by overloading the comma operator</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-06-01" href="https://en.wikipedia.org/wiki/?title=Comma_operator&amp;oldid=1293348737">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>